import pygame, time, threading
from config import *

class 位置:
    x: int = 0
    y: int = 0
    
    def __init__(self, x, y) -> None:
        self.x = x
        self.y = y

class 方向:
    上: int = 1
    下: int = 2
    左: int = 3
    右: int = 4

class 方块:
    类型 = type_1
    方位: int = 1

    位置: 位置
    def __init__(self, 类型, 方位, 位置) -> None:
        self.位置 = 位置
        self.类型 = 类型
        self.方位 = 方位

def init_run_env() -> tuple:
    return [[0 for i in range(每行数量)] for j in range(每列数量)]

def clear(screen, run_env: tuple ):
    当前位置 = 位置(0, 0)
    for i in run_env:
        for j in i:
            pygame.draw.rect(screen,  (0, 0, 0), (当前位置.x, 当前位置.y, 方块大小, 方块大小), 线宽 )
        当前位置.y += 方块大小 + 线宽 + 方块间隔
        当前位置.x -= ( 方块大小 + 线宽 + 方块间隔 ) * len(i)

def draw_run_env(screen, run_env: tuple ):
    clear(screen, run_env)
    当前位置 = 位置(0, 0)
    for i in run_env:
        for j in i:
            if j == 1:
                pygame.draw.rect(screen,  线的颜色, (当前位置.x, 当前位置.y, 方块大小, 方块大小), 线宽 )
            当前位置.x += 方块大小 + 线宽 + 方块间隔
        当前位置.y += 方块大小 + 线宽 + 方块间隔
        当前位置.x -= ( 方块大小 + 线宽 + 方块间隔 ) * len(i)

def init_screen() -> any :
    # 初始设置
    pygame.init() # 初始化pygame
    screen = pygame.display.set_mode(程序界面大小) # Pygame窗口
    pygame.display.set_caption("俄罗斯方块") # 标题

    pygame.draw.line(screen, 线的颜色, (游戏框_开始宽位置, 0), (游戏框_开始宽位置, 程序界面宽度), 线宽)
    pygame.draw.line(screen, 线的颜色, (游戏框宽, 0), (游戏框宽, 程序界面宽度), 线宽)
    pygame.draw.line(screen, 线的颜色, (游戏框宽, 200), (程序界面宽度, 200), 线宽)

    return screen


# 处理方块位置
def handle_position(当前位置: 位置, 移动方向: int) -> 位置:
    if ( 移动方向 == 方向.上 ):
        pass
    elif( 移动方向 == 方向.下 ):
        当前位置.y += 1
    elif( 移动方向 == 方向.左 ):
        当前位置.x -= 1
    elif( 移动方向 == 方向.右 ):
        当前位置.x += 1
    return 当前位置

# 移动方块
def move_rect(run_env, 当前方块: 方块, 移动方向: int) -> 方块:
    当前位置 = 当前方块.位置
    run_env = re_set_rect(run_env, 当前方块)
    当前位置 = 当前方块.位置 = handle_position(当前位置, 移动方向)
    set_rect(run_env, 当前方块)
    return 当前方块

def 创建初始方块(screen):
    pass

def 预测下一个方块():
    pass

# 碰撞检测
def collision_detection(当前方块: 方块, move_direction: int) -> bool:
    local = 位置(当前方块.位置.x, 当前方块.位置.y)
    if move_direction == 方向.左:
        if local.x - ( 方块大小 + 方块间隔 + 线宽 ) < 0:
            return False
    elif move_direction == 方向.右:
        if local.x + ( 方块大小 + 方块间隔 + 线宽 ) > 游戏框宽:
            return False
    return True

# 保持向下移动
def p_mover_rect(screen, 当前方块, time):
    is_while = True
    while is_while:
        if ( 当前方块.位置.y > 程序界面高度 ):
            is_while = False
        pygame.time.wait(time)
        threading.Lock.acquire()
        当前方块 = move_rect(screen, 当前方块, 方向.下)
        threading.Lock.release()

def re_set_rect(run_env: tuple, 方块):
    t = 方块.类型
    当前位置 = 位置(方块.位置.x, 方块.位置.y)
    for i in t:
        for j in i:
            if j == 1:
                run_env[当前位置.y][当前位置.x] = 0
            当前位置.x += 1
        当前位置.y += 1
        当前位置.x -= ( 1 ) * len(i)
    return run_env

def set_rect(run_env: tuple, 方块):
    t = 方块.类型
    当前位置 = 位置(方块.位置.x, 方块.位置.y)
    for i in t:
        for j in i:
            if j == 1:
                run_env[ 当前位置.y ][当前位置.x] = 1
            当前位置.x += 1
        当前位置.y += 1
        当前位置.x -= ( 1 ) * len(i)
    return run_env

## 程序开始执行

screen = init_screen()
keep_going = True
run_env = init_run_env()

当前位置 = 位置( 0 , 0)  # 初始位置
当前方块 = 方块(type_5, 1, 当前位置)
run_env = set_rect(run_env, 当前方块)

draw_run_env(screen, run_env)

PRO_INT = 1005

# 下落时间
down_time = 800

pygame.time.set_timer(PRO_INT, down_time)
clock = pygame.time.Clock()

# 游戏循环
while keep_going:
    clock.tick_busy_loop(30)
    for event in pygame.event.get():  # 遍历事件
        if event.type == pygame.QUIT:  # 退出事件
            keep_going = False
        elif event.type == pygame.KEYDOWN :
            if event.key == pygame.K_ESCAPE:
                keep_going = False
            elif event.key == pygame.K_LEFT:
                if collision_detection(当前方块, 方向.左):
                    当前方块 = move_rect(run_env, 当前方块, 方向.左)
            elif event.key == pygame.K_RIGHT:
                if collision_detection(当前方块, 方向.右):
                    当前方块 = move_rect(run_env, 当前方块, 方向.右)
            else:
                pass
        elif event.type == PRO_INT:
            当前方块 = move_rect(run_env, 当前方块, 方向.下)
        draw_run_env(screen, run_env)
    pygame.display.update()  # 刷新屏幕

# 退出程序
pygame.quit()



